package com.tool.utils.utils;

import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.os.Build;
import android.util.Log;

import java.lang.reflect.Field;

/**
 * 应用启动图标未读消息数显示 工具类 (效果如：QQ、微信、未读短信 等应用图标)<br/>
 * 依赖于第三方手机厂商(如：小米、三星)的Launcher定制、原生系统不支持该特性<br/>
 * 该工具类 支持的设备有 小米、三星、索尼【其中小米、三星亲测有效、索尼未验证】
 * 
 */
public class BadgeUtil {

	private static final String TAG = "BadgeUtil";

	/**
	 * Set badge count<br/>
	 * 针对 Samsung / xiaomi / sony 手机有效
	 * 
	 * @param context
	 *            The context of the application package.
	 * @param count
	 *            Badge count to be set
	 */
	@SuppressLint("DefaultLocale")
	public static void setBadgeCount(Context context, int count) {
		if (count <= 0) {
			count = 0;
		} else {
			count = Math.max(0, Math.min(count, 99));
		}

		if (Build.MANUFACTURER.equalsIgnoreCase("Xiaomi")) {
			sendToXiaoMi(context, count);
		} else if (Build.MANUFACTURER.equalsIgnoreCase("sony")) {
			sendToSony(context, count);
		} else if (Build.MANUFACTURER.toLowerCase().contains("samsung")) {
			sendToSamsumg(context, count);
		} else {
			Log.e(TAG, "The manufacturer ( " + Build.MANUFACTURER
					+ " ) Not Support to set Badge count.");
		}
	}

	/**
	 * 向小米手机发送未读消息数广播
	 * 
	 * @param count
	 */
	private static void sendToXiaoMi(Context context, int count) {
		try {
			@SuppressWarnings("rawtypes")
            Class miuiNotificationClass = Class
					.forName("android.app.MiuiNotification");
			Object miuiNotification = miuiNotificationClass.newInstance();
			Field field = miuiNotification.getClass().getDeclaredField(
					"messageCount");
			field.setAccessible(true);
			field.set(miuiNotification, String.valueOf(count == 0 ? "" : count)); // 设置信息数-->这种发送必须是miui
																				// 6才行
		} catch (Exception e) {
			e.printStackTrace();
			// miui 6之前的版本
			Intent localIntent = new Intent(
					"android.intent.action.APPLICATION_MESSAGE_UPDATE");
			localIntent.putExtra(
					"android.intent.extra.update_application_component_name",
					context.getPackageName() + "/"
							+ getLauncherClassName(context));
			localIntent.putExtra(
					"android.intent.extra.update_application_message_text",
					String.valueOf(count == 0 ? "" : count));
			context.sendBroadcast(localIntent);
		}
	}

	/**
	 * 向索尼手机发送未读消息数广播<br/>
	 * 据说：需添加权限：<uses-permission
	 * android:name="com.sonyericsson.home.permission.BROADCAST_BADGE" /> [未验证]
	 * 
	 * @param count
	 */
	private static void sendToSony(Context context, int count) {
		String launcherClassName = getLauncherClassName(context);
		if (launcherClassName == null) {
			return;
		}

		boolean isShow = true;
		if (count == 0) {
			isShow = false;
		}
		Intent localIntent = new Intent();
		localIntent.setAction("com.sonyericsson.home.action.UPDATE_BADGE");
		localIntent
				.putExtra(
						"com.sonyericsson.home.intent.extra.badge.SHOW_MESSAGE",
						isShow);// 是否显示
		localIntent.putExtra(
				"com.sonyericsson.home.intent.extra.badge.ACTIVITY_NAME",
				launcherClassName);// 启动页
		localIntent.putExtra(
				"com.sonyericsson.home.intent.extra.badge.MESSAGE",
				String.valueOf(count));// 数字
		localIntent.putExtra(
				"com.sonyericsson.home.intent.extra.badge.PACKAGE_NAME",
				context.getPackageName());// 包名
		context.sendBroadcast(localIntent);
	}

	/**
	 * 向三星手机发送未读消息数广播
	 * 
	 * @param count
	 */
	private static void sendToSamsumg(Context context, int count) {
		String launcherClassName = getLauncherClassName(context);
		if (launcherClassName == null) {
			return;
		}
		Intent intent = new Intent("android.intent.action.BADGE_COUNT_UPDATE");
		intent.putExtra("badge_count", count);
		intent.putExtra("badge_count_package_name", context.getPackageName());
		intent.putExtra("badge_count_class_name", launcherClassName);
		context.sendBroadcast(intent);
	}

	/**
	 * 重置、清除Badge未读显示数<br/>
	 * 
	 * @param context
	 */
	public static void resetBadgeCount(Context context) {
		setBadgeCount(context, 0);
	}

	/**
	 * Retrieve launcher activity name of the application from the context
	 * 
	 * @param context
	 *            The context of the application package.
	 * @return launcher activity name of this application. From the
	 *         "android:name" attribute.
	 */
	private static String getLauncherClassName(Context context) {
		PackageManager packageManager = context.getPackageManager();

		Intent intent = new Intent(Intent.ACTION_MAIN);
		// To limit the components this Intent will resolve to, by setting an
		// explicit package name.
		intent.setPackage(context.getPackageName());
		intent.addCategory(Intent.CATEGORY_LAUNCHER);

		// All Application must have 1 Activity at least.
		// Launcher activity must be found!
		ResolveInfo info = packageManager.resolveActivity(intent,
				PackageManager.MATCH_DEFAULT_ONLY);

		// get a ResolveInfo containing ACTION_MAIN, CATEGORY_LAUNCHER
		// if there is no Activity which has filtered by CATEGORY_DEFAULT
		if (info == null) {
			info = packageManager.resolveActivity(intent, 0);
		}

		return info.activityInfo.name;
	}

}